package com.redis.springbootredis.service.impl;

import com.redis.springbootredis.dao.StuDao;
import com.redis.springbootredis.entity.Stu;
import com.redis.springbootredis.service.StuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author
 * @create 2020-10-31 11:36
 */
@Service
public class StuServiceImpl implements StuService {

    @Autowired
    StuDao stuDao;

    /*
     * value相当于命名空间，可以任意，但是最好见名知意
     * key是和value一起组成唯一键值的附带条件，key可以等于methodName(执行的方法名)+其他的条件
     * condition 可以做一些简单的判断例如 condition = "#cid>3"表示只要cid大于3的时候才将查询的数据存入缓存当中
     * */
    @Cacheable(value = "stu",key = "#sid")
    @Override
    public Stu getStuByCid(Integer sid) {
        System.out.println("数据库查询");
        Stu stu = stuDao.selectStuByCid(sid);
        return stu;
    }

    @Cacheable(value = "stu",key = "methodName")
    @Override
    public List<Stu> getStuByLimit(Integer pageIndex, Integer pageSize) {
        System.out.println("数据库查询");
        List<Stu> stus = stuDao.selectStuByLimit(pageIndex,pageSize);
        return stus;
    }

    /*
     CachePut 是给添加和修改使用的缓存方法，它会将返回的值存入缓存
     没有返回值的话存入null
    */
    @Transactional
    @CachePut(value = "stu",key = "#stu.sid")
    @Override
    public Stu addStu(Stu stu) {
       System.out.println("添加");
       stuDao.insertStu(stu);
       return stu;
    }

    /*
    * CacheEvict是删除方法
    * beforeInvocation(true/false):是操作数据前删除缓存还是操作数据之后
    * allEntries:是否删除同一个value下的所有数据，默认是false
    */
    @CacheEvict(value = "studel",key = "#sid")
    @Override
    public void removeStu(Integer sid) {
      stuDao.deleteStu(sid);
    }

    @Transactional
    @CachePut(value = "stu",key = "#sid")
    @Override
    public String updateStu(Integer sid, String sname) {
        stuDao.modifyStu(sid, sname);
        return sname;
    }
}
